﻿using Microsoft.EntityFrameworkCore;
using System;

namespace Apex.ASPNETCore.UnitOfWork;
/// <summary>
/// 表示需要执行工作单元的方法的特性
/// </summary>
[AttributeUsage(
    AttributeTargets.Class | AttributeTargets.Method, // 表示该特性可以应用到类和方法上
    AllowMultiple = false, // 表示该特性在同一个类或方法上只能应用一次
    Inherited = true // 允许派生类继承该特性
    )]
public class UnitOfWorkAttribute : Attribute
{
    /// <summary>
    /// 获取或设置需要执行工作单元的 DbContext 类型数组
    /// </summary>
    public Type[] DbContextTypes { get; init; }

    /// <summary>
    /// 初始化 UnitOfWorkAttribute 类的新实例
    /// </summary>
    /// <param name="dbContextTypes">需要执行工作单元的 DbContext 类型数组</param>
    /// <exception cref="ArgumentException">当传入的 DbContext 类型数组中包含不继承自 DbContext 的类型时抛出</exception>
    public UnitOfWorkAttribute(params Type[] dbContextTypes)
    {
        this.DbContextTypes = dbContextTypes;
        foreach (var type in dbContextTypes)
        {
            if (!typeof(DbContext).IsAssignableFrom(type))
            {
                throw new ArgumentException($"{type} must inherit from DbContext");
            }
        }
    }
}
